/**
 * 
 */
package org.ztest.spring.di;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

/**
 * Spring自动检测，装配
 * @author lhl
 *
 * 2015年7月15日上午9:10:47
 */
@Component
// 将scopr标记为prototype
// 如果单利内部包含的字段需要多例，那么那个字段不能通过指定scope为prototype来实现
// 而要通过其他方式比如通过getBean的方式给字段赋值
// 即多例可以包含单利或者多例，而单利包含的多例则不起作用。
@Scope("prototype")
public class MessagePrinter
{
	// 所有标记为Autowired的构造函数、字段、setter、config method都会自动装配
	// 如果标记的是方法则该方法在类初始化时会被调用
	
	// 装配方式1，标记字段为Autowired，此时必须有无参构造函数
	@Autowired
	private MessageService service;
	
	@Autowired
	private BeanFactory beanFactory;
	
	// 单例模式下的MessagePrinter，多例nc字段没什么用处
	@SuppressWarnings("unused")
	@Autowired
	private NestClass nc;
	
	public NestClass getNC()
	{
		// 如果nc只需要单例，则可以使用这种方式获得单例nc
//		return nc;
		
		// 如果MessagePrinter为单例但nc又需要多例，则可以使用这种方式
		// 产生多例nc
		return beanFactory.getBean(NestClass.class);
	}
	
	public MessagePrinter()
	{
	}
	
	// 装配方式2，标记构造函数为Autowired，此时构造函数的参数将被自动赋值
//	@Autowired
//	public MessagePrinter(MessageService service)
//	{
//		this.service = service;
//	}
	
	public void printMessage()
	{
		System.out.println(service.getMessage());
	}
}
